/* 业务处理超时，查看服务器的处理情况
    当服务器达到了一个性能瓶颈，在一次业务处理中花费了太长的时间（超过了服务器设置的非活跃超时时间）
     1. 在一次业务处理中耗费太长时间，导致其他的连接也被连累超时，其他的连接有可能会被拖累超时释放
     假设现在  12345描述符就绪了， 在处理1的时候花费了30s处理完，超时了，导致2345描述符因为长时间没有刷新活跃度
       1. 如果接下来的2345描述符都是通信连接描述符，如果都就绪了，则并不影响，因为接下来就会进行处理并刷新活跃度
       2. 如果接下来的2号描述符是定时器事件描述符，定时器触发超时，执行定时任务，就会将345描述符给释放掉
          这时候一旦345描述符对应的连接被释放，接下来在处理345事件的时候就会导致程序崩溃（内存访问错误）
          因此这时候，在本次事件处理中，并不能直接对连接进行释放，而应该将释放操作压入到任务池中，
          等到事件处理完了执行任务池中的任务的时候，再去释放
*/
#include "../http.hpp"

int main()
{
    //让父进程忽略子进程终止信号，由操作系统自动回收子进程资源，避免僵尸进程
    signal(SIGCHLD,SIG_IGN); 
    
    //忽略因服务器意外关闭链接，而客户端继续Send，导致OS发送SIGPIPE信号给客户端的进程终止
    //signal(SIGPIPE,SIG_IGN);
    //创建10个子进程，让子进程作为客户端对服务器发起链接并发起请求接收响应
    for(int i = 0;i < 10;i++)
    {
        pid_t id = fork();
        if(id < 0)
        {
            ERROR_LOG("fork fail");
            return -1;
        }
        if(id == 0)
        {
            printf( "我是子进程:  %d \n", i); 
            Socket client;
            client.CreateClient(8085,"117.72.116.235");
                                //1:请求行                2.请求头部                             3.空行  4. 请求正文：
            std::string req = "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
            while(1)
            {
                assert(client.Send(req.c_str(), req.size()) != -1);
                char buf[1024] = {0};//接收响应
                assert(client.Recv(buf,1023));
                DEBUG_LOG("[%s]",buf);
                //sleep(1);
            }
            client.Close();
            exit(0); //子进程退出
        }
        //sleep(1);
    }

    while(1) sleep(1);
    
    return 0;
}